package com.lovi.homework;

public class StringDetailHomeWork {
    public static void main(String[] args) {
        String s1 = "lovi";
        Animal a = new Animal(s1);
        Animal b = new Animal(s1);
        System.out.println(a == b);//F,因为引用类型比较地址

        System.out.println(a.equals(b));//F,因为引用类型比较地址,没有重写equals方法
        System.out.println(a.name == b.name);//T,因为两个字符串都指向常量池，
        // 池中已经存在lovi,所以地址相同
        String s4 = new String("lovi");
        String s5 = "lovi";
        System.out.println(s1 == s4);//F,因为s4是new出来的,指向堆中地址，堆中的地址再指向常量池的lovi
        //本质地址还是堆中的地址，和常量池不同
        System.out.println(s4 == s5);//F
        //s4是堆中的，s5是常量池中的，自然F
        String t1 = "hello" + s1;
        String t2 = "hellolovi";
        System.out.println(t1 == t2);//F
        //对于t1，的s1是变量，会创建StringBuilder对象，然后先append 常量 hello
        // 再append s1，也就是lovi，然后调用toString方法，里面返回new String(value, 0, count);
        // 所以t1是堆中的对象，堆中的"hellolovi"指向常量池中的对象，所以F
        System.out.println(t1.intern() == t2);//T
        //对于t1.intern()，会先判断常量池中是否有"hellolovi"，有，返回常量池中的对象，
        // 没有，就new一个常量池中的"hellolovi"，然后返回，和 t2对应的常量池中的对象一样 。所以T
    }
}

class Animal {
    String name;


    public Animal(String name) {
        this.name = name;
    }
}
